package com.yunxin.core.infra.persistence.mapper.order;

import cn.hutool.core.date.DateTime;
import com.yunxin.core.application.admin.team.Team;
import com.yunxin.core.application.admin.team.TeamTaskDistribute;
import com.yunxin.core.application.admin.team.TeamTaskRecord;
import com.yunxin.core.application.dto.user.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.*;


public interface OrderTeamTaskDetailMapper {


    /**
     * 将订单分配到团队
     * @param
     * @param teamId
     * @param taskId
     */
    int saveOrderToTeam(@Param("orderId") List<Long> orderId, @Param("teamId") Long teamId, @Param("taskId") int taskId);

    /**
     * 查询团队所有人员
     * @param teamId
     * @return
     */
    List<Long> selectTeamOfPerson(@Param("teamId") Long teamId);

    /**
     * 根据商户id查询团队信息
     * @param accountId
     * @return
     */
    List<Team> findTeamByAccount(@Param("accountId") Long accountId);


    /**
     * 根据商户用户关关联关系查询用户id
     * @param accountId
     * @return
     */
    SysUser findUserIdByAccountId(@Param("accountId") Long accountId);


//    List<Long> selectOrderUserAllocation(@Param("teamId") Long teamId);


    /**
     * 将订单分配给用户
     * @param orderId
     * @param userId
     */
    void distributeOrderUserApply(@Param("orderId") Long orderId,@Param("userId") Long userId,@Param("submitTime")DateTime submitTime);

    /**
     * 同时修改任务详情中订单状态
     * @param orderStatus
     * @param id
     */
    void updateTaskDetailOrderStatus(@Param("orderStatus") Integer orderStatus,@Param("id") Long id);

    /**
     * 更新任务详情表
     * @param oid
     * @param currentAccountId
     */
    void updateTeamTaskDetail(@Param("oid") Long oid,@Param("currentAccountId") Long currentAccountId,@Param("startTime")DateTime startTime);

    /**
     * 根据任务id查询订单
     * @param taskId
     * @return
     */
    List<Long> selectOrderUserAllocationByTaskId(@Param("taskId") Integer taskId);

    /**
     * 更新团队下次分配时间
     * @param nextTime
     * @param taskId
     */
    void updateTeamTaskNextTimeForTeam(@Param("nextTime") DateTime nextTime,@Param("taskId") Integer taskId);

    /**
     * 根据id查询团队
     * @param teamId
     * @return
     */
    Team findTeam(@Param("teamId") Long teamId);

    /**
     * 根据任务id更新原来的详情
     * @param orderIds
     * @param teamId
     * @param taskId
     */
    void updateTeamTaskDetailRecord(@Param("orderIds") List<Long> orderIds,@Param("teamId") long teamId,@Param("taskId") Integer taskId);

    /**
     * 根据任务id更新原来的详情
     * @param taskId
     * @param teamId
     */
    void updateTeamTaskDetailByTaskId(@Param("taskId") Integer taskId,@Param("teamId") Integer teamId);

    /**
     * 查询当天是否已经存在统计表
     * @param start
     * @param end
     * @return
     */
    List<TeamTaskDistribute> selectTeamCountByTime(@Param("start") DateTime start,@Param("end") DateTime end,@Param("userId") List<Long> userId);


    /**
     * 首次统计（新增）
     * @param userId
     * @param teamId
     * @param teamName
     * @param count
     * @param time
     */
    void insertIntoForCount(@Param("userId") Long userId,@Param("userName")String userName, @Param("teamId") Long teamId,@Param("teamName") String teamName,@Param("count") Integer count,@Param("time") DateTime time);


    /**
     * 首次统计（更新）
     * @param userId
     * @param teamId
     * @param teamName
     * @param count
     * @param start
     */
    void updateForCount(@Param("userId") Long userId,@Param("teamId") Long teamId,@Param("teamName") String teamName,@Param("count") Integer count,@Param("time") Date start);


    /**
     * 根据usreId查询userName
     * @param userId
     * @return
     */
    String getUserNameByUserId(@Param("userId") Long userId);

    /**
     * 二次分发
     * @param userId
     * @param teamId
     * @param teamName
     * @param count
     * @param time
     */
    void updateForCountTwo(@Param("userId") Long userId,@Param("teamId") Long teamId,@Param("teamName") String teamName,@Param("count") Integer count,@Param("time") Date time);

    /**
     * 查询任务详情表中是否包含该任务订单
     * @param orderId
     * @return
     */
    Integer getTaskDetailOrder(@Param("orderId") Long orderId);
}